/**
 * @ Author: enmotion
 * @ Create Time: 2025-04-15 16:30:41
 * @ Modified by: Your name
 * @ Modified time: 2025-10-20 14:06:46
 * @ Description: 这是一个基于 Koa 框架的简单服务器应用，支持 WebSocket 和静态文件服务
 */
import Koa from 'koa';  // 引入 Koa 框架，这是一个轻量级的 Node.js Web 应用框架。
import StaticServer from "koa-static"; // koa-static 是一个用于提供静态文件服务的 Koa 中间件。
import KoaWebSocket from "koa-websocket"; // koa-websocket 是一个用于支持 WebSocket 的 Koa 中间件。
// @ts-ignore
import cors from "@koa/cors";
import path from "path";
import Router from "koa-router"; // koa-router 是一个用于处理路由的 Koa 中间件库。
import KoaBody from 'koa-body'; // koa-body 是一个用于处理 POST 请求体的 Koa 中间件。
import authMiddleware from "./middlewares/auth"; // token 鉴权 中间件
import errosMiddleware from "./middlewares/error" // 错误处理 中间件
import fs from 'fs';
// import { swaggerMiddleware } from './config/swagger';

import { startAgendaTask } from './agenda';

import { userRouter } from "@modules/users-class"
// import { clientRouter} from "@modules/client-class"
import { systemRouter } from "@modules/system";
import { categoryRouter, tagRouter, tagAssociationRouter } from '@modules/content-type';
import { searchTaskRouter } from '@modules/rednote-search-task';
// import { problemRouter } from "@modules/problems"
// import { AppreciateRouter } from '@modules/appreciate';
// import { modelEssayRouter } from "@modules/model-essay";
import { expandAppRouter } from '@modules/app-manage';
import { appPublicRouter } from '@modules/app-public';

// const userModel = userUserModel(mongoose,'/users') // 实例化用户模块
// // 读取 SSL 证书与密钥文件，用于 HTTPS 连接。这里假设 ssl 证书和密钥文件放在项目的 ssl 文件夹中。
// const options = {
//   key: fs.readFileSync(path.join(__dirname,'ssl','mid.wow11.key')),
//   cert: fs.readFileSync(path.join(__dirname,'ssl','mid.wow11.pem')),
// };
// 创建 Koa 实例并判断是否为开发环境。如果不是开发环境，则启用 HTTPS。
// 注意：在生产环境中，需要确保安全地管理 SSL 密钥和证书文件，避免泄露。
// const app = process.env.KOA_APP_NODE_ENV == "development" ? KoaWebSocket(new Koa()) : KoaWebSocket(new Koa(), {}, options);
const app = new Koa()
startAgendaTask()
// 确保上传目录存在
const uploadDir = path.join(__dirname, '../public/uploads');
if (!fs.existsSync(uploadDir)) {
  fs.mkdirSync(uploadDir, { recursive: true });
}

// 设置上传目录环境变量
process.env.APP_DEFAULT_UPLOAD_DIR = 'public/uploads';

app.use(cors())
// 使用 KoaBody 中间件来解析请求体。可以处理 JSON、表单等格式。但这里没有启用文件上传功能（formidable 配置被注释掉了）。
app.use(errosMiddleware);

// 使用 koa-static 中间件来提供静态文件服务，default ./public 作为静态资源目录。
app.use(StaticServer('public'));
// Add static file serving for uploads directory
app.use(StaticServer(path.join(__dirname, '../public')));

// 添加 Swagger 中间件（放在路由之前）
// app.use(swaggerMiddleware);

// 使用 KoaBody 中间件来解析请求体。可以处理 JSON、表单等格式。但这里没有启用文件上传功能（formidable 配置被注释掉了）。
app.use(KoaBody({ 
  multipart: true, // 允许上传文件
  formidable: {
    uploadDir: uploadDir, // 使用确保存在的上传目录
    keepExtensions: true,  // 保留文件扩展名
    maxFileSize: 10 * 1024 * 1024, // 最大文件大小（10MB）
    onFileBegin: (name, file) => { // 文件上传前的处理
      // 安全处理文件名，移除特殊字符
      if (file.originalFilename) {
        const safeFileName = file.originalFilename.replace(/[\[\]\(\)]/g, '_');
        file.originalFilename = safeFileName;
        file.newFilename = safeFileName;
        console.log(`开始上传文件: ${safeFileName}`);
      }
    },
  },
  jsonLimit:'1mb', // 设置 JSON 数据大小限制为 1MB
  formLimit:'1mb', // 设置表单数据大小限制为 1MB
  textLimit:'1mb'  // 设置文本数据大小限制为 1MB
}));
app.use(authMiddleware);
app.use(userRouter.routes());
// app.use(clientRouter.routes());
app.use(systemRouter.routes());
app.use(categoryRouter.routes());
app.use(tagRouter.routes());
app.use(tagAssociationRouter.routes());
app.use(searchTaskRouter.routes());
// app.use(problemRouter.routes())
// app.use(modelEssayRouter.routes())
app.use(expandAppRouter.routes())
app.use(appPublicRouter.routes())
// app.use(AppreciateRouter.routes())
// app.use(appSystemModel(mongoose,'/system').router.routes())
// Koa-router 的 allowedMethods() 中间件可以根据路由的定义自动设置相应的 HTTP 状态码。
app.use(new Router().allowedMethods())
// 简单的中间件处理示例，所有的 GET 请求都会返回 "Hello, Koa with TypeScript! 12313132"。
// 这段代码位置需要注意：在 Koa 中中间件的执行顺序是从上到下。如果上面的中间件已经处理了某些请求，那么下面的中间件将不再执行。
// app.use(async (ctx) => {
//   console.log(getLocalServerIP());
//   ctx.body = 'Hello, Koa with TypeScript!';
// });

export default app; // 导出 Koa 实例，以便在其他地方使用或进行启动。